perm filename GRADER.SAI[4,KMC]1 blob
sn#177290 filedate 1975-09-17 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00005 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN
C00004 00003 PROC OUT_BOTH(VALUE STRING LINE)
C00006 00004 PROC GRADE
C00009 00005 BLANKS ← "...................................."
C00010 ENDMK
C⊗;
BEGIN
REQUIRE "IODEFS.SAI[SEC,RCP]" SOURCE_FILE;
SAFE INTEGER ARRAY GD_VAL, DISTRIB [1:15];
SAFE STRING ARRAY GD_NAME [1:15];
SAFE REAL ARRAY GD_PCT [1:15];
INTEGER POSSIBLE, STUDENTS;
STRING PER;
α Should just accept grades, then select grading percentages to give desired
fractions of each letter grade (or just produce normal distribution).
PROC ALTER_PCT;
BEGIN
FOR I ← 1 TIL 15 DO
BEGIN
OUTSTR(GD_NAME[I] ∂ "=" ∂ CVS(ROUND(GD_PCT[I]*100)) & "% ↑" ↓);
DISTRIB[I] ← 0;
END;
WHILE GET_A_STRING("Do you approve [Y,N]") = "N" DO
FOR I ← 1 TIL 12 DO
BEGIN
INTEGER PCT;
PCT ← GET_AN_INT(GD_NAME[I] ∂ "=");
IF PCT > 0 THEN GD_PCT[I] ← PCT / 100;
END;
FOR I ← 1 TIL 15 DO
GD_VAL[I] ← ROUND(GD_PCT[I] * POSSIBLE);
END;
INTEGER PROC GET_SUM(VALUE STRING QUESTION);
BEGIN
STRING LINE;
INTEGER SUM;
LINE ← GET_A_STRING(QUESTION);
SUM ← 0;
DO SUM ← SUM + INTSCAN(LINE, BRK) UNTIL BRK = -1;
RETURN(SUM);
END;
PROC INIT_PCT;
BEGIN
STRING GN, GV;
GN ← "A+A A-B+B B-C+C C-D+D D-F INNG";
GV ← ".98 .92 .9 .88 .85 .8 .78 .72 .68 .66 .64 .6 .4 .01 0";
FOR I ← 1 TIL 15 DO
BEGIN
GD_NAME[I] ← GN[2*I-1 FOR 2];
GD_PCT[I] ← REALSCAN(GV, BRK);
END;
END;
PROC OUT_BOTH(VALUE STRING LINE);
BEGIN
OUTSTR(LINE ↓);
OUT_LINE(LINE ↓);
END;
PROC PRINT_DISTRIB;
BEGIN
FILOUT("DISTRI." & PER, OUCH1);
OUT_BOTH("Grade distribution for period" ∂ PER ↓);
FOR I ← 2 STEP 3 UNTIL 11 DO
BEGIN
INTEGER J, SUM;
SUM ← 0;
FOR J ← -1 TIL 1 DO
BEGIN
SUM ← SUM + DISTRIB[I+J];
OUT_BOTH(GD_NAME[I+J] ∂ ":" ∂ CVS(DISTRIB[I+J]));
END;
OUT_BOTH(TAB & TAB & GD_NAME[I] ∂ "=" ∂
CVS(ROUND(SUM * 100.0 / STUDENTS)) & "%");
END;
FOR I ← 13 TIL 15 DO
BEGIN
OUT_BOTH(GD_NAME[I] ∂ ":" ∂ CVS(DISTRIB[I]));
OUT_BOTH(TAB & TAB & GD_NAME[I] ∂ "=" ∂
CVS(ROUND(DISTRIB[I] * 100.0 / STUDENTS)) & "%");
END;
RELEASE(OUCH1);
END;
PROC GRADE;
BEGIN
STRING NAME;
DO POSSIBLE ← GET_SUM("Points possible")
UNTIL GET_A_STRING(CVS(POSSIBLE) ∂ "OK [Y,N]") = "Y";
INIT_PCT;
ALTER_PCT;
FILIN("PERIOD." & PER, INCH1);
FILOUT("GRADES." & PER, OUCH1);
STUDENTS ← 0;
WHILE (NAME ← IN_LINE) DO
BEGIN "Student"
INTEGER POINTS;
STRING L_NAME;
L_NAME ← SCAN(NAME, 8, BRK);
STUDENTS ← STUDENTS + 1;
DO BEGIN
POINTS ← GET_SUM(NAME ∂ L_NAME);
I ← 1;
WHILE POINTS < GD_VAL[I] DO I ← I + 1;
END
UNTIL GET_A_STRING(CVS(POINTS) ∂ "=" ∂ GD_NAME[I]) = "Y";
DISTRIB[I] ← DISTRIB[I] + 1;
OUT_LINE(LEFTJ(20, L_NAME & "," & NAME) &
LEFTJ(4,CVS(POINTS)) ∂ "=" ∂ GD_NAME[I]);
FOR I ← 1 TIL 4 DO NAME ← IN_LINE;
END "Student";
RELEASE(INCH1);
RELEASE(OUCH1);
PRINT_DISTRIB;
WHILE GET_A_STRING("Do you like this distribution") = "N" DO
BEGIN "Redistrib"
STRING LINE;
ALTER_PCT;
FILIN("GRADES." & PER, INCH1);
FILOUT("TEMP." & PER, OUCH1);
WHILE (LINE ← IN_LINE) DO
BEGIN "Line"
INTEGER POINTS;
POINTS ← CVD(LINE[21 FOR 4]);
I ← 1;
WHILE POINTS < GD_VAL[I] DO I ← I + 1;
DISTRIB[I] ← DISTRIB[I] + 1;
OUT_LINE(LINE[1 FOR 27] & GD_NAME[I]);
END "Line";
RENAME(INCH1, NULL, 0, FLAG);
RELEASE(INCH1);
RENAME(OUCH1, "GRADES." & PER, 5, FLAG);
RELEASE(OUCH1);
PRINT_DISTRIB;
END "Redistrib";
END;
BLANKS ← "....................................";
BREAK_LINE;
BREAK_COMMA;
WHILE (PER ← GET_A_STRING("Period # [<CR> for none]")) DO GRADE;
END